/*
 * @Author: zhw 443844039@qq.com
 * @Date: 2025-08-05 00:26:34
 * @LastEditors: zhw 443844039@qq.com
 * @LastEditTime: 2025-08-13 00:03:39
 * @Description: 通用字典工具函数(vue2版本)，直接返回数组
 */
import { getDictData } from '@/api/system/dict/useDict'
import Vue from 'vue'

// 全局字典缓存
const dictCache = {}
// 响应式容器映射表
const reactiveMap = new Map()

/**
 * 获取字典数据
 * @param {string|string[]} dictTypes - 字典类型，支持单个或多个
 * @returns {Array|Object} 直接返回响应式数组（单个）或包含响应式数组的对象（多个）
 */
export function useDict(dictTypes) {
  // 处理单个字典类型
  if (typeof dictTypes === 'string') {
    // 如果已有响应式数组，直接返回
    if (reactiveMap.has(dictTypes)) {
      return reactiveMap.get(dictTypes)
    }

    // 创建响应式数组
    const reactiveArr = Vue.observable([])
    reactiveMap.set(dictTypes, reactiveArr)
    
    loadSingleDict(dictTypes, reactiveArr)
    return reactiveArr
  }

  // 处理多个字典类型
  if (Array.isArray(dictTypes)) {
    const result = Vue.observable({})
    dictTypes.forEach(type => {
      result[type] = useDict(type) // 复用单个字典的处理逻辑
    })
    return result
  }

  return []
}

// 加载单个字典数据到响应式数组
function loadSingleDict(dictType, reactiveArr) {
  if (!dictType) {
    reactiveArr.splice(0, reactiveArr.length, ...[])
    return
  }

  // 从缓存获取
  if (dictCache[dictType]) {
    reactiveArr.splice(0, reactiveArr.length, ...dictCache[dictType])
    return
  }

  // 初始化空数组，避免select为空
  reactiveArr.splice(0, reactiveArr.length, ...[])

  // 缓存不存在时异步加载
  getDictData(dictType)
    .then(res => {
      const formattedData = (res.data || []).map(item => ({
        dictLabel: item.dictLabel,
        dictCode: item.dictCode,
        children: item.children || [],
      }))
      dictCache[dictType] = formattedData
      // 更新响应式数组（使用splice保证引用不变）
      reactiveArr.splice(0, reactiveArr.length, ...formattedData)
    })
    .catch(() => {
      reactiveArr.splice(0, reactiveArr.length, ...[])
    })
}